home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue55 / Alfresco / TestRW.dpr < prev   
Text File  |  2000-02-10  |  3KB  |  122 lines

  1. program TestRW;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.   Windows,
  7.   SysUtils,
  8.   Classes,
  9.   AAThread;
  10.  
  11. type
  12.   TWriterThread = class(TThread)
  13.     private
  14.       FId : integer;
  15.     protected
  16.       procedure Execute; override;
  17.     public
  18.       property Id : integer read FId write FId;
  19.   end;
  20.  
  21.   TReaderThread = class(TThread)
  22.     private
  23.       FId : integer;
  24.     protected
  25.       procedure Execute; override;
  26.     public
  27.       property Id : integer read FId write FId;
  28.   end;
  29.  
  30. var
  31.   ReadWriteSync : TaaReadWriteSync;
  32.   Log : text;
  33.   LogCS : TRTLCriticalSection;
  34.  
  35. procedure SafeWriteln(aMsg : string);
  36. begin
  37.   EnterCriticalSection(LogCS);
  38.   writeln(Log, aMsg);
  39.   LeaveCriticalSection(LogCS);
  40. end;
  41.  
  42. procedure TWriterThread.Execute;
  43. var
  44.   i : integer;
  45. begin
  46.   for i := 1 to 100 do begin
  47.     ReadWriteSync.StartWriting;
  48.     writeln(Log, 'writer active: ', Id);
  49.     write(Id);
  50.     ReadWriteSync.StopWriting;
  51.   end;
  52. end;
  53.  
  54. procedure TReaderThread.Execute;
  55. var
  56.   i : integer;
  57. begin
  58.   for i := 1 to 50 do begin
  59.     ReadWriteSync.StartReading;
  60.     SafeWriteln(Format('reader active: %d', [Id]));
  61.     Sleep(Random(500));
  62.     ReadWriteSync.StopReading;
  63.   end;
  64. end;
  65.  
  66. var
  67.   Readers : array [0..6] of TReaderThread;
  68.   Writers : array [0..2] of TWriterThread;
  69.   i : integer;
  70.   Handles : array [0..9] of THandle;
  71.  
  72. begin
  73.   writeln('Starting test');
  74.   writeln('(Writers show their id in this window when writing)');
  75.  
  76.   {create the log file}
  77.   Assign(Log, 'C:\Thread.LOG');
  78.   Rewrite(Log);
  79.   InitializeCriticalSection(LogCS);
  80.  
  81.   {create the sync object}
  82.   ReadWriteSync := TaaReadWriteSync.Create;
  83.  
  84.   {set up 7 readers and 3 writers}
  85.   for i := 0 to 6 do begin
  86.     Readers[i] := TReaderThread.Create(true);
  87.     Readers[i].Id := i;
  88.   end;
  89.   for i := 0 to 2 do begin
  90.     Writers[i] := TWriterThread.Create(true);
  91.     Writers[i].Id := i;
  92.   end;
  93.  
  94.   {save the handles for the wait for multiple objects call}
  95.   for i := 0 to 6 do
  96.     Handles[i] := Readers[i].Handle;
  97.   for i := 0 to 2 do
  98.     Handles[7+i] := Writers[i].Handle;
  99.  
  100.   {start the whole lot going}
  101.   for i := 0 to 2 do
  102.     Writers[i].Resume;
  103.   for i := 0 to 6 do
  104.     Readers[i].Resume;
  105.  
  106.   {wait for them all to finish}
  107.   WaitForMultipleObjects(10, @Handles, true, INFINITE);
  108.  
  109.   {destroy the thread objects (they've all completed)}
  110.   for i := 0 to 6 do
  111.     Readers[i].Free;
  112.   for i := 0 to 2 do
  113.     Writers[i].Free;
  114.  
  115.   {close the log file}
  116.   DeleteCriticalSection(LogCS);
  117.   Close(Log);
  118.   writeln;
  119.   writeln('Done');
  120.   readln;
  121. end.
  122.